#include <stdio.h>		/* printf ssize_t */
#include <sys/stat.h>	/* mkfifo */
#include <fcntl.h>		/* open O_RDONLY */
#include <unistd.h>		/* read close unlink */
#include "comm.h"

#define RCV_BUF_SIZE 16
static char rcv_buf[RCV_BUF_SIZE];

/* 先运行server，再运行client；
   client写入端只能open，不能close，否则server会一直阻塞在open中 */

int main()
{
	unlink(FIFO_NAME); /* 先删除有名管道，防止创建不成功 */
	
	/* 创建命名管道，创建的目录不能在Windows下的共享文件夹中，也不能是~/xxx */
	int ret = mkfifo(FIFO_NAME, 0664);
	if (ret < 0) {
		printf("make fifo '%s' error %d\n", FIFO_NAME, ret);
		perror("perror");	/* 如果发生了错误，则打印具体的错误提示 */
		return -1;
	}

	printf("waitting for fifo write...\n");

	/* 用只读的方式打开命名管道；
	   本读取端必须先打开，否则client写入端的open会一直阻塞*/
	int fd = open(FIFO_NAME, O_RDONLY);
	if (fd < 0) {
		printf("server open fifo error\n");
		return -1;
	}

	while (1) {
		/* 读取指定长度的内容，如果未读满则返回已读的长度，如果无数据可读则返回0，不阻塞 */
		ssize_t len = read(fd, rcv_buf, sizeof(rcv_buf) - 1);
		if (len < 0) {
			printf("server read error\n");
			goto exit;
		}

		/* 打印读到的字符串 */
		if (len > 0) {
			rcv_buf[RCV_BUF_SIZE - 1] = '\0';
			printf("server get[%d]: %s\n", len, rcv_buf);
		}
	}

exit:
	close(fd);
	unlink(FIFO_NAME); /* 删除有名管道 */

	return 0;
}
